﻿//// ===============================================================================
//// XCI.NET 西安交通信息WinForm开发框架 2018 版权所有
//// ===============================================================================
//using System;
//using System.Collections.Generic;
//using System.Data;
//using System.Linq.Expressions;
//using XCI.Core;
//using XCI.Data.Expressions;

//namespace XCI.Data
//{
//    /// <summary>
//    /// 服务基类
//    /// </summary>
//    /// <typeparam name="T">实体类型</typeparam>
//    public class BaseService<T>
//    {
//        /// <summary>
//        /// 新建SQL查询对象
//        /// </summary>
//        protected SQLQuery<T> SQL => new SQLQuery<T>();

//        /// <summary>
//        /// 获取数据库对象
//        /// </summary>
//        /// <returns>返回新创建的数据库对象</returns>
//        public virtual Database GetDatabase()
//        {
//            return new Database();
//        }

//        /// <summary>
//        /// 是否存在指定条件的记录
//        /// </summary>
//        /// <param name="expression">查询表达式</param>
//        /// <returns>存在返回true,否则返回false</returns>
//        protected bool Exists(Expression<Func<T, bool>> expression)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Exists<T>(expression);
//            }
//        }

//        /// <summary>
//        /// 插入数据
//        /// </summary>
//        /// <param name="entity">实体对象</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int Insert(T entity)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Insert<T>(entity);
//            }
//        }

//        /// <summary>
//        /// 插入数据(指定写入的列)
//        /// </summary>
//        /// <typeparam name="T">实体类型</typeparam>
//        /// <param name="entity">实体对象</param>
//        /// <param name="cols">写入的列数组(null为所有列)</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int InsertInclude(T entity, string[] cols = null)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.InsertInclude<T>(entity, cols);
//            }
//        }

//        /// <summary>
//        /// 插入数据(指定排除的列)
//        /// </summary>
//        /// <typeparam name="T">实体类型</typeparam>
//        /// <param name="entity">实体对象</param>
//        /// <param name="excludeCols">排除写入的列数组(不允许为空)</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int InsertExclude(T entity, string[] excludeCols)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.InsertExclude<T>(entity, excludeCols);
//            }
//        }

//        /// <summary>
//        /// 插入数据(需要写入的列和值对象,支持对象类型,不检查主键)
//        /// </summary>
//        /// <param name="obj">写入对象(需要写入的列和值对象,支持对象类型,不检查主键字段)</param>
//        /// <param name="tableName">表名称</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int InsertObject(object obj, string tableName)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.InsertObject(obj, tableName);
//            }
//        }

//        /// <summary>
//        /// 更新实体数据
//        /// </summary>
//        /// <param name="entity">实体对象</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int Update(T entity)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Update<T>(entity);
//            }
//        }

//        /// <summary>
//        /// 更新实体数据
//        /// </summary>
//        /// <param name="entity">实体对象</param>
//        /// <param name="expression">查询表达式</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int Update(T entity, Expression<Func<T, bool>> expression)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Update<T>(entity, expression);
//            }
//        }

//        /// <summary>
//        /// 更新实体数据((指定更新的列)
//        /// </summary>
//        /// <typeparam name="T">实体类型</typeparam>
//        /// <param name="entity">实体对象(默认写入值不为null的属性)</param>
//        /// <param name="expression">查询表达式</param>
//        /// <param name="cols">更新的列数组(null为所有列)</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int UpdateInclude(T entity, Expression<Func<T, bool>> expression, string[] cols = null)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.UpdateInclude<T>(entity, expression, cols);
//            }
//        }

//        /// <summary>
//        /// 更新实体数据(指定排除的列)
//        /// </summary>
//        /// <typeparam name="T">实体类型</typeparam>
//        /// <param name="entity">实体对象(默认写入值不为null的属性)</param>
//        /// <param name="expression">查询表达式</param>
//        /// <param name="excludeCols">排除更新的列数组(不允许为空)</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int UpdateExclude(T entity, Expression<Func<T, bool>> expression, string[] excludeCols)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.UpdateExclude<T>(entity, expression, excludeCols);
//            }
//        }

//        /// <summary>
//        /// 删除数据
//        /// </summary>
//        /// <param name="id">主键</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int Delete(string id)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Delete<T>(id);
//            }
//        }

//        /// <summary>
//        /// 删除数据
//        /// </summary>
//        /// <param name="entity">实体对象</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int Delete(T entity)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Delete<T>(entity);
//            }
//        }

//        /// <summary>
//        /// 删除数据
//        /// </summary>
//        /// <param name="expression">查询表达式</param>
//        /// <returns>返回受影响的行数</returns>
//        protected int Delete(Expression<Func<T, bool>> expression)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Delete<T>(expression);
//            }
//        }

//        /// <summary>
//        /// 获取实体对象
//        /// </summary>
//        /// <param name="id">主键</param>
//        /// <returns>返回实体对象</returns>
//        protected T Get(string id)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Get<T>(id);
//            }
//        }

//        /// <summary>
//        /// 获取实体对象
//        /// </summary>
//        /// <param name="expression">查询表达式</param>
//        /// <returns>返回实体对象</returns>
//        protected T Get(Expression<Func<T, bool>> expression)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Get<T>(expression);
//            }
//        }

//        /// <summary>
//        /// 获取实体对象
//        /// </summary>
//        /// <param name="sqlQuery">查询表达式</param>
//        /// <returns>返回实体对象</returns>
//        protected T Get(SQLQuery<T> sqlQuery)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Get<T>(sqlQuery);
//            }
//        }

//        /// <summary>
//        /// 获取单个字段值
//        /// </summary>
//        /// <typeparam name="V">值类型</typeparam>
//        /// <param name="sqlQuery">查询表达式</param>
//        /// <returns>返回单个字段值</returns>
//        public V GetValue<V>(SQLQuery<T> sqlQuery)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.GetValue<V, T>(sqlQuery);
//            }
//        }

//        /// <summary>
//        /// 获取单个字段值
//        /// </summary>
//        /// <typeparam name="V">值类型</typeparam>
//        /// <param name="expression">查询表达式</param>
//        /// <param name="colName">指定列</param>
//        /// <returns>返回单个字段值</returns>
//        public V GetValue<V>(Expression<Func<T, bool>> expression, Expression<Func<T, object>> colName)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.GetValue<V, T>(expression, colName);
//            }
//        }

//        /// <summary>
//        /// 获取合计列
//        /// </summary>
//        /// <param name="colName">指定列</param>
//        /// <returns>返回取合计列</returns>
//        protected int? Sum(Expression<Func<T, object>> colName)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Sum<T>(colName);
//            }
//        }

//        /// <summary>
//        /// 获取合计列
//        /// </summary>
//        /// <param name="colName">指定列</param>
//        /// <param name="expression">查询表达式</param>
//        /// <returns>返回取合计列</returns>
//        protected int? Sum(Expression<Func<T, object>> colName, Expression<Func<T, bool>> expression)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Sum<T>(colName, expression);
//            }
//        }

//        /// <summary>
//        /// 获取记录数
//        /// </summary>
//        /// <returns>返回记录数</returns>
//        protected int Count()
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Count<T>();
//            }
//        }

//        /// <summary>
//        /// 获取记录数
//        /// </summary>
//        /// <param name="expression">查询表达式</param>
//        /// <returns>返回记录数</returns>
//        protected int Count(Expression<Func<T, bool>> expression)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Count<T>(expression);
//            }
//        }

//        /// <summary>
//        /// 查询数据查询数据
//        /// </summary>
//        /// <returns>返回记录集合</returns>
//        protected IEnumerable<T> Query()
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Query<T>();
//            }
//        }

//        /// <summary>
//        /// 查询数据查询数据
//        /// </summary>
//        /// <returns>返回记录集合</returns>
//        protected IEnumerable<T> Query(string sql, object args = null)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Query<T>(sql, args);
//            }
//        }

//        /// <summary>
//        /// 查询数据查询数据
//        /// </summary>
//        /// <returns>返回记录集合</returns>
//        protected IEnumerable<T> Query(Expression<Func<T, bool>> expression)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Query<T>(expression);
//            }
//        }

//        /// <summary>
//        /// 查询数据
//        /// </summary>
//        /// <param name="sqlQuery">查询表达式</param>
//        /// <returns>返回记录集合</returns>
//        protected IEnumerable<T> Query(SQLQuery<T> sqlQuery)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Query<T>(sqlQuery);
//            }
//        }

//        /// <summary>
//        /// 查询DataTable
//        /// </summary>
//        /// <param name="sqlQuery">查询表达式</param>
//        /// <returns>返回DataTable</returns>
//        protected DataTable GetTable(SQLQuery<T> sqlQuery)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.GetTable<T>(sqlQuery);
//            }
//        }

//        /// <summary>
//        /// 查询分页数据
//        /// </summary>
//        /// <param name="sqlQuery">查询表达式</param>
//        /// <returns>返回分页列表</returns>
//        protected PagedList<T> Page(SQLQuery<T> sqlQuery)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Page<T>(sqlQuery);
//            }
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        /// <param name="pageIndex"></param>
//        /// <param name="pageSize"></param>
//        /// <param name="sql"></param>
//        /// <param name="args"></param>
//        /// <returns></returns>
//        protected PagedList<T> Page(int pageIndex, int pageSize, string sql, object args = null)
//        {
//            using (var db = GetDatabase())
//            {
//                return db.Page<T>(pageIndex, pageSize, sql, args);
//            }
//        }

//    }
//}